/*
 * Copyright (C) 2025 ameise <ameise.wang@gmail.com> - All Rights Reserved
 *
 * This file is part of e3pool.
 *
 * e3pool is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * e3pool is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with e3pool. If not, see <https://www.gnu.org/licenses/>.
 */

package go_pool

import (
	"errors"
	"fmt"
)

func safeFunc(h PanicHook, where string, f GoAsyncFunc, args ...any) {
	defer recoverPanic(h, where)
	f(args...)
}

func recoverPanic(h PanicHook, where string) {
	if x := recover(); x != nil {
		var msg string
		if where != "" {
			msg = fmt.Sprintf("[%s] %+v\n", where, x)
		} else {
			msg = fmt.Sprintf("%+v\n", x)
		}
		if h != nil {
			h.OnPanic(errors.New(msg))
		} else {
			_gLogger.Error(msg).Println()
		}
	}
}
